package conf

import (
	"context"

	"google.golang.org/grpc"

	"gitee.com/segeln/grit/log"
	"gitee.com/segeln/grit/toolkit"
)

var (
	//LenStackBuf = 1024

	Conf *Config

	//configfile string
	configFile = "server.cfg"
)

func SetConfigFile(filename string) {
	configFile = filename
}

type SetConfigItem func(*Config)
type Config struct {
	//服务名称（通过服务名查找可用的服务）
	Name string `json:"name"`
	//服务ID（相同服务名不能存在同样的服务ID）
	Sid     string `json:"sid"`
	Port    int    `json:"port"`
	Version string `json:"version"`
	//静态文件目录
	StaticDir []string `json:"staticdir"`
	//注册服务器配置
	RegistryCfg ConfigRegistry `json:"registrycfg"`
	//扩展配置
	Settings map[string]interface{} `json:"settings"`
	//日志文件
	FileLogCfg ConfigFileLog `json:"filelogcfg"`

	FunInterceptor func(context.Context, interface{}, *grpc.UnaryServerInfo, grpc.UnaryHandler) (interface{}, error)
}

/*
type Options struct {
	Port      int
	Name      string
	ServiceID string
	Version   string
	Registry  registry.Registry
}
*/

//文件日志配置
type ConfigFileLog struct {
	//服务注册服务类型
	LogFilePath string `json:"logfilepath"`
	//服务注册服务IP地址
	LogFileName string `json:"logfilename"`
}

//注册服务器配置
type ConfigRegistry struct {
	//服务注册服务类型
	Type string `json:"type"`
	//服务注册服务IP地址
	Address string `json:"address"`
	//注册间隔时间（注册中心掉线可重连）
	Interval int `json:"interval"`
}

func ParseConfig() *Config {
	cfg := &Config{}
	err := toolkit.ParseJsonConfigFile(configFile, cfg) // (name, cfg)
	if err != nil {
		log.Exitln("Failed to read the service configuration file(", configFile, "),error:", err)
	}
	return cfg
}
func GetCfgValue(key string) interface{} {
	return Conf.Settings[key]
}

func NewConfigs(cfg *Config, opts ...SetConfigItem) {
	//var wdPath, confPath, Logdir, BIdir *string
	//var ProcessID *string
	/*
		opt := Options{
			Port:     9003,
			Registry: consule.NewConsulRegistry(), //.DefaultRegistry,
		}
		for _, o := range opts {
			o(&opt)
		}
	*/
	for _, o := range opts {
		o(cfg)
	}
	//return opt
}

func Staticdir(staticDir []string) SetConfigItem {
	return func(o *Config) {
		o.StaticDir = staticDir
	}
}

func Port(port int) SetConfigItem {
	return func(o *Config) {
		o.Port = port
	}
}
func Name(name string) SetConfigItem {
	return func(o *Config) {
		o.Name = name
	}
}

func ServiceID(sid string) SetConfigItem {
	return func(o *Config) {
		o.Sid = sid
	}
}
func Version(v string) SetConfigItem {
	return func(o *Config) {
		o.Version = v
	}
}

func SetInterceptor(v func(context.Context, interface{}, *grpc.UnaryServerInfo, grpc.UnaryHandler) (interface{}, error)) SetConfigItem {
	return func(o *Config) {
		o.FunInterceptor = v
	}
}
